<?php
namespace Anls\Com\Strategy;
/**
 * 表达式 
 * @author w.
 * 
 * 
 * 表达式：E(e),e=[>|<|!=|==] 
 * 
 * 条件设置例子：
 *      5日均线上穿10日均线比较：B(ma_5)E(cross)B(ma_10)
 *      5日均线大于当天收盘价：B(ma_5)E(>)B(close)
 */
class Expr {
    // > &gt;  < &lt;
    
    // bar
    const B_REGEX = 'B';
    // 逻辑
    const E_REGEX = 'E';
    // 获取单个值
    const EXPR_REGEX = '/###KEY###\(([^\)]+)\)/';
    // 获取所有键
    const KEYS_MATCH_REGEX = '/\)([^\(]+)\(/';
    // 获取所有值
    const VALUES_MATCH_REGEX = '/\(([^\)]+)\)/';
    // 获取所有B表达式的值
    const B_VALUES_MATCH_REGEX = '/B\(([^\)]+)\)/';
    // 匹配表达式BEB类型
    const EXPR_BEB_REGEX = '/^B\([^\)]+\)E\([^\)]+\)B\([^\)]+\)$/';
    // 表达式BEB类型
    const EXPR_BEB_TYPE = 'BEB';
    
    // 获取正则表达式
    public static function getRegex($key){
        return str_replace('###KEY###', $key, Expr::EXPR_REGEX);
    }
    
    public static function machKey($key,$content){
        $rst = array();
        preg_match_all(Expr::getRegex($key),$content, $rst);
        return $rst;
    }
    
    public static function matchKeys($content){
        $rst = array();
        preg_match_all(Expr::KEYS_MATCH_REGEX,')'.$content, $rst);
        return $rst;
    }
    
    public static function matchVals($content){
        $rst = array();
        preg_match_all(Expr::VALUES_MATCH_REGEX,')'.$content, $rst);
        return $rst;
    }
    
    public static function getExprType($expr){
        $rst = array();
        preg_match(self::EXPR_BEB_REGEX,$expr, $rst);
        if(count($rst)>0){
            return self::EXPR_BEB_TYPE;
        }
    }
}

?>
